/******************************************************************************
 * Copyright (C) 2021, Xiaohua Semiconductor Co., Ltd. All rights reserved.
 *
 * This software component is licensed by XHSC under BSD 3-Clause license
 * (the "License"); You may not use this file except in compliance with the
 * License. You may obtain a copy of the License at:
 *                    opensource.org/licenses/BSD-3-Clause
 *
 ******************************************************************************/

/******************************************************************************
 * @file   main.c
 *
 * @brief  Source file for GPIO example
 *
 * @author MADS Team 
 *
 ******************************************************************************/

/******************************************************************************
 * Include files
 ******************************************************************************/
#include "ddl.h"
#include "lpuart.h"
#include "lpm.h"
#include "gpio.h"
#include "sysctrl.h"

#include "my_gpio.h"
#include "sys_param.h"
#include "my_uart.h"
#include "my_adc.h"
#include "atim3.h"
#include "my_base_timer.h"
#include "my_wwdt.h"

/******************************************************************************
 * Local pre-processor symbols/macros ('#define')
 ******************************************************************************/

/******************************************************************************
 * Global variable definitions (declared in header file with 'extern')
 ******************************************************************************/

/******************************************************************************
 * Local type definitions ('typedef')
 ******************************************************************************/

/******************************************************************************
 * Local function prototypes ('static')
 ******************************************************************************/

/******************************************************************************
 * Local variable definitions ('static')                                      *
 ******************************************************************************/

/******************************************************************************
 * Local pre-processor symbols/macros ('#define')
 ******************************************************************************/

/*****************************************************************************
 * Function implementation - global ('extern') and local ('static')
 ******************************************************************************/
//static void App_LedInit(void);
#if 0
二、底座：
1、连接TYPE-C的充电消毒
   当主机和底座上形成消毒感应装置；当主机放置后底座消毒紫灯灯条闪烁亮起，开启1mins消毒工作，工作结束后通电绿灯。
   未连接充电线的底座，仅为放置作用。



3、底座灯条：采用RGB灯调节颜色效果
   > 通电状态下，当主机未放入底座时：
                    1、 绿灯长亮    
                    2、 紫灯熄灭
   > 通电状态下，当主机放入底座时：
                    1、UV消毒灯工作，绿灯关闭，紫灯按0.5ON/1.5OFF闪烁一分钟后熄灭；   
                    2、1分钟后UV消毒灯关闭，紫灯关闭   
                    3、主机开始充电，绿灯开始呼吸，
                        当检测到主机充满时，绿灯常亮
   > 不通电状态下，无任何灯效
#endif


uint8_t soft_ver_str[20] = "V0.0.2.0";
extern uint8_t uart_printf_flag;

/**
 ******************************************************************************
 ** \brief  紫灯控制
 **
 ** \return 无  10m调用一次
 ******************************************************************************/
static  inline void purple_led_breath(void)
{
    static int delay_cnt = 0;
    static int purple_led_on_flag = 0;
    
    delay_cnt ++;
    if(delay_cnt % 50 == 0){
        if(purple_led_on_flag){
            PURPLE_LED_OFF();
            purple_led_on_flag = 0;
        }
        else{
            PURPLE_LED_ON();
            purple_led_on_flag = 1;
        }
    }
}

extern volatile uint32_t u32AdcRestult;

/**
 ******************************************************************************
 ** \brief  Main function of project
 **
 ** \return uint32_t return value, if needed
 **
 ** This sample
 **
 ******************************************************************************/
int main(void)
{
    int sys_10ms_cnt = 0;
	int sys_2ms_cnt = 0;
    int sys_5ms_cnt = 0;
    int led_refresh_delay = 0;
    uint8_t led_on_flag;
    uint8_t printf_delay;

	uint8_t sys_10ms_flag;
    uint8_t last_disp_sta;
    
    // 定时器初始化
    my_base_timer_init();
    my_wdt_init();

    led_gpio_init();
    all_led_on();
    sys_param_init();
    charge_en_off();
    // charge_en_on();
    // test 
    set_sys_sta(IDLE_STA);
    green_led_off();
    my_uart_init();
	my_adc_init();
    printf("\r\n JE3_base soft_ver:[%s] \r\n", soft_ver_str);
	
    while(1)
    {
        if(sys_data.sys_5ms_flag){
            sys_data.sys_5ms_flag = 0;
            charge_state_check();
            sys_5ms_cnt ++;

            if(sys_5ms_cnt%2){
                sys_data.sys_10ms_flag = 1;
                dealwith_uart_recv();
            }

            if(sys_data.sys_10ms_flag){
                sys_data.sys_10ms_flag = 0;
                sys_10ms_cnt ++;
                if (0 == sys_10ms_cnt % 50 ){
                    base_err_sta_check();
                }
                
                if(sys_10ms_cnt >= 100){
                     
                    sys_10ms_cnt = 0;
                    sys_data.sys_1s_flag = 1;
                   	my_wdt_feed();  //喂狗
#ifndef  RELEASE_VER  
                    if(uart_printf_flag){
                        printf("\r\n JE3_base soft_ver:[%s] \r\n", soft_ver_str);
                    }
                    printf_delay ++;
                    if(0 == printf_delay%5){
                        printf("\n\r sys_sta:[%d],discharge_cnt:[%d]  \n\r", get_sys_sta(), sys_data.force_dischage_cnt); 
                        printf("\n\r online_flag:[%d],offline_cnt:[%d],oneline_cnt:[%d]  \n\r",  sys_data.host_online_flag, sys_data.host_offline_cnt, sys_data.host_online_cnt); 
                    }
#endif                    
                    sys_data.run_cnt ++;
                    // printf("sys_cnt = [%d]  \n\r", sys_data.run_cnt); 
                    if(CHARGED_FINISH_STA == get_sys_sta()){
                        sys_data.close_charge_en_delay ++;

                        if(sys_data.close_charge_en_delay > CHARGE_EN_DELAY){
                            sys_data.close_charge_en_delay = 0;
                            charge_en_off();
#ifndef  RELEASE_VER 
                            printf("close_charge_en_delay [%d]  \n\r", CHARGE_EN_DELAY); 
#endif                           
                        }
                    }
                    else if(ALING_DIS_CHARGE_STA == get_sys_sta()){
                        sys_data.force_dischage_cnt ++;
                        if(sys_data.force_dischage_cnt > 30){
                            sys_data.force_dischage_cnt = 0;
                            set_sys_sta(ALING_CHARGE_STA); // 在充电状态，打开充电使能, 不充电时，底座的低和主机串口地线不通，导致无法接受到串口信息
#ifndef  RELEASE_VER 
                            printf(" go to ALING_CHARGE_STA  \n\r"); 
#endif 
                        }
                    }
                    else{
                        sys_data.close_charge_en_delay = 0;
                        sys_data.force_dischage_cnt = 0;
                    }
                }

            /**********显示部分****************/ 
            switch (get_sys_sta()){
            case IDLE_STA:{
                if(IDLE_STA != last_disp_sta){
#ifndef  RELEASE_VER 
                    printf("now IDLE_STA  \n\r"); 
#endif 
                    sys_data.charge_cnt = 0;
                    purple_led_off();
                    uv_led_off();
                    green_led_on();
                    charge_en_off();
                }
                green_led_on();
                last_disp_sta = IDLE_STA;
                break;
            }
                
            case CHARING_FIRST_1MIN_STA:{                      
                if(sys_data.sys_1s_flag){
                    sys_data.sys_1s_flag = 0;
                    
                    sys_data.charge_cnt ++;
                    if(sys_data.charge_cnt >= 60){
                        sys_data.charge_cnt = 0;
                        purple_led_off();
                        uv_led_off();
                        set_sys_sta(CHARING_STA);
                        break;
                    }
                }				
                if(last_disp_sta != CHARING_FIRST_1MIN_STA){
                    green_led_off();
                    uv_led_on(); 
                    last_disp_sta = CHARING_FIRST_1MIN_STA;
                    charge_en_on();
#ifndef  RELEASE_VER 
                    printf("now CHARING_FIRST_1MIN_STA  \n\r"); 
#endif 
                }
                purple_led_breath();
                break;
                }
                case CHARING_STA:{
                    
                    
                    // 如果串口没有数据过来，或者过来已经时充满，则 200ms闪灭
                    // if(((sys_data.host_online_flag)&&(sys_data.host_charg_full_flag))){
                    //     led_refresh_delay ++;
                    //     if(0 == led_refresh_delay%20){
                    //         if(led_on_flag)
                    //         {
                    //             green_led_on();
                    //             led_on_flag = 0;
                    //         }
                    //         else{
                    //             green_led_off();
                    //             led_on_flag = 1;
                    //         }
                    //     }
                    // }
                    // else{
                        green_led_breath(); // 正常情况下呼吸闪烁
                    // }
                    if(CHARING_STA != last_disp_sta){
                        printf("now CHARING_STA  \n\r"); 
                    }
                    last_disp_sta = CHARING_STA;

                    break;
                }
                case CHARGED_FINISH_STA:{
                    if(CHARGED_FINISH_STA != last_disp_sta){
                        green_led_on();
#ifndef  RELEASE_VER 
                    printf("now CHARGED_FINISH_STA  \n\r"); 
#endif 
                    }
                    
                    // charge_en_off(); // 延时关闭
                    last_disp_sta = CHARGED_FINISH_STA;
                    break;    
                }
                case ALING_CHARGE_STA:{
                    charge_en_on(); // 延时关闭
                    last_disp_sta = ALING_CHARGE_STA;
                     purple_led_off();
                    uv_led_off();
                    green_led_breath(); // 正常情况下呼吸闪烁
                    break;
                }

                case ALING_DIS_CHARGE_STA:{
       
                    charge_en_off(); // 延时关闭
                    purple_led_off();
                    uv_led_off();
                    green_led_on();
                    last_disp_sta = ALING_DIS_CHARGE_STA;
                    break;

                    break;
                }
                default:
                    break;
                }
        
            }
        }

    }
}

/******************************************************************************
 * EOF (not truncated)
 ******************************************************************************/


